package fr.lille.inria.adam.lifl.EcoGardeInventory.scrapper;

import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.message.BasicNameValuePair;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import android.util.Log;
import android.util.SparseArray;
import fr.lille.inria.adam.lifl.EcoGardeInventory.Utils.EspeceEntry;

/**Cette tâche invoque le formulaire qui sert à envoyer une observation. Ce 
 * formulaire est specifique à un groupe d'espece et la clé du groupe cible 
 * devra être précisée à l'execution de la tâche.
 * 
 * Plusieurs jeu de données sont extraits : noms des especes, précisions et comportement
 * @author liabeuf
 */
public class ObservationFormScrapTask extends HttpAsyncTask<Integer, ObservationFormData> {
	public static final String TASK_URL = "http://signature.enm-lille.fr/enlmsig/index.php?cont=mod_bio_res&event=loadFormAjout";

	@Override
	protected ObservationFormData doInBackground(Integer... params) {
		if (params.length <= 0) Log.w("ScrapObservationFormTask", "Groupe d'espece manquant");
		Integer grpEspece = params[0];
		
		// #region Création de la requête (un POST avec une valeur groupe pour le groupe d'espece
		HttpPost formRequest = new HttpPost(TASK_URL);
		List<NameValuePair> pairs = new ArrayList<NameValuePair>();
		pairs.add(new BasicNameValuePair("groupe", grpEspece.toString()));
		UrlEncodedFormEntity requestEntity = null;
		try {
			requestEntity = new UrlEncodedFormEntity(pairs);
		} catch (UnsupportedEncodingException e) {
			Log.wtf("ScrapObservationFormTask", "Donnée des POST innadmissible", e);
		}
		formRequest.setEntity(requestEntity);
		// #endregion
		
		// #region Extraction
		HttpResponse formResult = browser.execute(formRequest);
		Document doc = Jsoup.parse(super.getStringContent(formResult));
		ObservationFormData result = new ObservationFormData(grpEspece);
		
		// #region Extraction des especes
		Elements communsHtml = doc.select("select#listeNomCommun>option");
		Elements latinsHtml = doc.select("select#listeNomLatin>option");
		result.especes = new SparseArray<EspeceEntry>(communsHtml.size()-1);
		for (Element aCommunOpt : communsHtml) {
			if (aCommunOpt.attr("value").equals("") || aCommunOpt.text().equals("(?)")) continue;
			
			EspeceEntry entry = new EspeceEntry();
			entry.id = Integer.parseInt(aCommunOpt.attr("value"));
			entry.commun = aCommunOpt.text();
			result.especes.put(entry.id, entry);
		}
		
		for (Element aLatinOpt : latinsHtml) {
			if (aLatinOpt.attr("value").equals("") || aLatinOpt.text().equals("(?)")) continue;
			int id = Integer.parseInt(aLatinOpt.attr("value"));
			EspeceEntry entry = result.especes.get(id);
			if (entry == null) {entry=new EspeceEntry(); entry.id=id;}
			entry.latin=aLatinOpt.text();
		}
		// #endregion
		
		// #region Extraction des précisions
		Elements precisionsHtml = doc.select("select#listePrecisionEffectif>option");
		result.precisions = new SparseArray<String>(precisionsHtml.size()-1);
		for (Element aPrecOpt : precisionsHtml) {
			if (aPrecOpt.attr("value").equals("")) continue;
			result.precisions.put(Integer.parseInt(aPrecOpt.attr("value")), aPrecOpt.text());
		}
		// #endregion
		
		// #region Extraction des comportements
		Elements comportementsHtml = doc.select("select#listeComportement>option");
		result.comportements = new SparseArray<String>(comportementsHtml.size()-1);
		for (Element aCompOpt : comportementsHtml) {
			if (aCompOpt.attr("value").equals("")) continue;
			result.comportements.put(Integer.parseInt(aCompOpt.attr("value")), aCompOpt.text());
		}
		// #endregion
		// #endregion
		
		return result;
	}

}
